﻿@* Supprimer cette section si le regroupement est utilisé *@
@section Scripts {
    <script src="~/Scripts/jquery.validate.min.js"></script>
    <script src="~/Scripts/jquery.validate.unobtrusive.min.js"></script>
}

@{
    Layout = "~/_SiteLayout.cshtml";
    Page.Title = "Inscription";

    string email = "";
    string loginData = "";
    string providerDisplayName = "";

    var returnUrl = Request.QueryString["ReturnUrl"];
    if (returnUrl.IsEmpty()) {
        // Certains fournisseurs de connexions externes demandent toujours une URL de retour
        returnUrl = Href("~/");
    }

    // Validation de la configuration
    Validation.RequireField("email", "Le champ Nom d'utilisateur est obligatoire.");

    if (IsPost && Request.Form["newAccount"].AsBool()) {
        // Gestion du formulaire d'inscription de nouveau compte
        AntiForgery.Validate();
        email = Request.Form["email"];
        loginData = Request.Form["loginData"];

        string provider = "";
        string providerUserId = "";
        if (WebSecurity.IsAuthenticated || !OAuthWebSecurity.TryDeserializeProviderUserId(loginData, out provider, out providerUserId)) {
            Response.Redirect("~/Account/Manage");
            return;
        }

        providerDisplayName = OAuthWebSecurity.GetOAuthClientData(provider).DisplayName;
        if (Validation.IsValid()) {
            // Insérer un nouvel utilisateur dans la base de données
            //var db = Database.Open("StarterSite");
            var dbcontext = new alguillet_ExpenseManagerEntities();
            

            // Vérifier si l'utilisateur n'existe pas déjà
            //var user = db.QuerySingle("SELECT Email FROM UserProfile WHERE LOWER(Email) = LOWER(@0)", email);

            if (dbcontext.Members.Where(u => u.Email == email).Count() == 0)
            {
                // Insérer l'adresse de messagerie dans la table de profils
                Member member = new Member();
                member.Email = email;
                member.Login = email;

                dbcontext.Members.Add(member);
                dbcontext.SaveChanges();
                

                //db.Execute("INSERT INTO UserProfile (Email) VALUES (@0)", email);
                OAuthWebSecurity.CreateOrUpdateAccount(provider, providerUserId, email);

                OAuthWebSecurity.Login(provider, providerUserId, createPersistentCookie: false);

                Context.RedirectLocal(returnUrl);
                return;
            } else {
                ModelState.AddError("email", "Le nom d'utilisateur existe déjà. Entrez un nom d'utilisateur différent.");
            }
        }
    } else {
        // Gestion des rappels du fournisseur de connexions externe

        var result = OAuthWebSecurity.VerifyAuthentication(Href("~/Account/RegisterService", new { returnUrl }));
        if (result.IsSuccessful) {
            bool registered = OAuthWebSecurity.Login(result.Provider, result.ProviderUserId, createPersistentCookie: false);
            if (registered) {
                Context.RedirectLocal(returnUrl);
                return;
            }

            if (WebSecurity.IsAuthenticated) {
                // Si l'utilisateur actuel est connecté, ajoutez le nouveau compte
                OAuthWebSecurity.CreateOrUpdateAccount(result.Provider, result.ProviderUserId, WebSecurity.CurrentUserName);
                Context.RedirectLocal(returnUrl);
                return;
            } else {
                // Il s'agit d'un nouvel utilisateur, saisissez le nom d'utilisateur par défaut indiqué par le fournisseur de connexions externe
                email = result.UserName;
                loginData = OAuthWebSecurity.SerializeProviderUserId(result.Provider, result.ProviderUserId);
                providerDisplayName = OAuthWebSecurity.GetOAuthClientData(result.Provider).DisplayName;
            }
        } else {
            Response.Redirect("~/Account/ExternalLoginFailure");
            return;
        }
    }
}
<hgroup class="title">
    <h1>@Page.Title.</h1>
    <h2>Associez votre compte @providerDisplayName.</h2>
</hgroup>

<form method="post">
    @AntiForgery.GetHtml()
    <input type="hidden" name="loginData" value="@loginData" />
    @* En cas d'au moins une erreur de validation, avertir l'utilisateur *@
    @Html.ValidationSummary(excludeFieldErrors: true)

    <fieldset>
        <legend>Formulaire d'inscription</legend>
        <p>
            Authentification auprès de <strong>@providerDisplayName</strong> réussie.
            Entrez ci-dessous un nom d'utilisateur pour ce site, puis cliquez sur le bouton Confirmer pour vous
            connecter.
        </p>
        <ol>
            <li class="email">
                <label for="email" @if (!ModelState.IsValidField("email")) {<text>class="error-label"</text>}>Adresse de messagerie</label>
                <input type="text" id="email" name="email" value="@email" @Validation.For("email") />
                @* Rédiger toute erreur de validation de messagerie sur la page *@
                @Html.ValidationMessage("email")
            </li>
        </ol>
        <button type="submit" name="newAccount" value="true">S'inscrire</button>
    </fieldset>
</form>
